//引入router,VueRouter类的实例
import router from './router'
//引入仓库
import store from './store'
//引入element-ui插件,message提示信息插件
import { Message } from 'element-ui'

//引入进度条
import NProgress from 'nprogress' 
import 'nprogress/nprogress.css' 
NProgress.configure({ showSpinner: false }) 
//获取本地存储token
import { getToken } from '@/utils/auth' 

import getPageTitle from '@/utils/get-page-title'


//定义数组,数组里面放置的是登录路由的路径
const whiteList = ['/login'];

//全局守卫：前置守卫
router.beforeEach(async(to, from, next) => {
  //只要有路由的变化进度条开始动
  NProgress.start()
  //设置网页左上角的标题
  document.title = getPageTitle(to.meta.title);
  //获取本地存储token
  const hasToken = getToken()
  //获取用户信息【token:获取用户信息】
  const hasGetUserInfo = store.getters.name
  //用户登录
  if (hasToken) {
    //用户登录,还想去登录！！！指定不能去
    if (to.path === '/login') {
       next(false)
       NProgress.done()
    } else {
      //用户登录,有用户信息立即放行
      if (hasGetUserInfo) {
        next()
      } else {
        try {
          //用户登录,没有用户信息，发请求获取用户
          await store.dispatch('user/getInfo');
          console.log('刷新在此发请求获取用户信息');
          //潘家成当时没有考虑到一个问题,如果是动态计算出来的路由[刷新：重新渲染消耗时间的]
          //代表跳过去的路由渲染完毕以后在放行!!!!
          next({...to});
        } catch (error) {
          //token过期:退出登录功能
          await store.dispatch('user/resetToken')
          Message.error(error || 'Has Error')
          //你们的需求：退出在会首页
          next(`/login?redirect=${to.path}`)
          NProgress.done()
        }
      }
    }
  } else {
    //用户未登录想去登录
    if (whiteList.indexOf(to.path) !== -1) {
      //直接放行
      next()
    } else {
      //用户未登录，访问一些路由,在登陆以后直接跳转到曾经想去而没有去的地方
      next(`/login?redirect=${to.path}`)
      NProgress.done()
    }
  }
})

//全局守卫:后置守卫
router.afterEach(() => {
  //访问某一个路由结束，进度条结束
  NProgress.done()
})
